package com.xxq.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
@Slf4j
@RequestMapping("/file")
@Api(value = "文件上传下载接口管理", tags = {"文件上传下载接口管理"})
public class FileController {

    private static String dirPath = "D:\\tmp\\upload\\";

    @PostMapping("/upload")
    @ApiOperation(value = "文件上传", notes = "文件上传")
    public String fileUpload(@RequestPart("file") MultipartFile multipartFile) {
        //获得上传文件的原始名
        String originalFilename = multipartFile.getOriginalFilename();
        /**
         * 设置上传文件的"保存地址"
         */
        //从HTTP请求对象中获取ServletContext对象，然后使用ServletContext对象的.getRealPath()方法来获得“真实路径”。
//        String dirPath = request.getServletContext().getRealPath("/upLoadFile/"); //会在out目录下的打包的项目的“根目录”下创建该文件夹，用于存储文件
        File filePath = new File(dirPath);
        //如果保存文件的地址不存在，则先创建目录
        if (!filePath.exists()) {
            filePath.mkdirs(); //创建目录(创建文件夹)
        }
        //使用UUID重新命名上传的文件名称(上传人_uuid_原始文件名称)
                /*
                  UUID.randomUUID() 是Java中的一个方法，用于生成一个随机的、唯一的标识符（Universally Unique Identifier，简称UUID）
                 */
        String newFilename = UUID.randomUUID() + originalFilename;
        try {
            //使用MultipartFile接口的 transferTo()方法将文件上传到指定位置
                    /*
                        transferTo(File file) : 该方法中的参数本质上为“上传文件”的存储地址信息，因为multipartFile接口就代表“上传文件本身”
                     */
            multipartFile.transferTo(new File(dirPath + newFilename));
            System.out.println(new File(dirPath + newFilename));
        } catch (IOException e) {
            e.printStackTrace();
            return "error"; //返回错误页面
        }

        //跳转成功页面
        return "success";
    }

    @GetMapping("/download")
    @ApiOperation(value = "文件下载", notes = "文件下载")
    public ResponseEntity<byte[]> fileDownload(HttpServletRequest request, String fileName) throws IOException {
        // 指定要下载文件所在路径
//        String realPath = request.getServletContext().getRealPath("upLoadFile/");
        File file = new File(dirPath + File.separator + fileName);
        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        // 通知浏览器以下载的方式打开文件
        headers.setContentDispositionFormData("attachment", fileName);
        // 定义“以流的形式下载”返回文件数据
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // 使用Spring MVC框架的ResponseEntity对象封装下载数据
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
        return responseEntity;
    }
}
